﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lola.Modelo;
using Lola.ModeloVista;




namespace Lola.Control
{
    public class Sistema
    {
        private List<Lola.Modelo.Galpon> galpones;
        private List<Lola.Modelo.Servicio> servicios;
        private static Sistema sistema;

        private Sistema ()
        {
            galpones=new List<Lola.Modelo.Galpon>();
            servicios =new List<Lola.Modelo.Servicio>();

        }

        public static Sistema getInstanceSistema()
        {
            if (sistema == null)
            {
                sistema = new Sistema();
            }
            return sistema;
        }

        public List<Lola.Modelo.Servicio> Servicios
        {
            get { return servicios; }
            set { servicios = value; }
        }

        public List<Lola.Modelo.Galpon> Galpones
        {
            get { return galpones; }
            set { galpones = value; }
        }




        public void RegistrarIngresoGalpon(string codigo,List<int> legajos)
            //IMPORTANTE!!! FALTA TODO EL MANEJO DE ERRORES!!!
        {
            //Recibo el codigo del servicio, una lista con los legajos de los choferes,
            //Cuando una unidad ingresa o egresa del galpón se registran los datos de la unidad y de los choferes. El sistema a desarrollar debe,
            //        -	Validar la existencia de la unidad en la tabla de Micros
            //        -	Validar la existencia de los choferes en la tabla de Choferes
            //        -	Validar la existencia del servicio en la tabla Servicio
            //        -	Actualizar el estado del servicio en la tabla Servicio

            
            Servicio servicio = buscarServicio(codigo);
            if (servicio == null)
            {
                Console.WriteLine("No existe el servicio");
            }
            else
            {

                //Me fijo si el servicio tiene asignado el micro que ingreso a porteria
                if (servicio.existeMicroAsignado())
                {
                    //Me fijo si el servicio tiene asignado los choferes que ingresaron a Porteria
                    if (!servicio.sonChoferesAsignados(codigo, legajos))
                    {
                        Console.WriteLine("Los choferes no estan asignados al servicio");
                    }
                    else
                    {
                        // Esta todo OK -- Actualizo el estado del servicio
                       servicio.actualizarEstadoServicio("En Circuito", servicio.Codigo);
                        
                    }
                }
                else
                {
                    Console.WriteLine("El servicio no tiene Micro asignado");
                }
                                            

            }

          
        }
        private Servicio buscarServicio(string codigo)
        {
            //Me fijo si existe el servicio en memoria sino busco en la BD
            Servicio servicio = new Servicio();

            for (int i=0;i<servicios.Count;i++)
            {
                if (servicios.ElementAt(i).Codigo.Equals(codigo))
                {
                    servicio= servicios.ElementAt(i);
                    return servicio;
                }
            }
            
            return servicio.obtenerServicio(codigo);
        }


        public void RegistrarEgresoGalpon(string codigo)
        {
            Servicio servicio = buscarServicio(codigo);
            if (servicio == null)
            {
                Console.WriteLine("No existe el servicio");
            }
            else
            {
                if (servicio.Incidencias!=null)
                    servicio.actualizarEstadoServicio("Con Incidencias", servicio.Codigo);
                else
                    servicio.actualizarEstadoServicio("Completo", servicio.Codigo);
            }
        }

        public void RegistarParteNovedades()
        {
            throw new System.NotImplementedException();
        }

        public void AltaDeIncidencia(string codigo,int numeroInc, 
                                      DateTime fechaInc, string gravedad, string descrip, int prioridad)
        {
            Servicio servicio = buscarServicio(codigo);
            if (servicio == null)
            {
                Console.WriteLine("No existe el servicio");
            }
            else
            {
                servicio.altaDeIncidencia(codigo, numeroInc, fechaInc, gravedad, descrip, prioridad);

            }

        }

        public void BajaDeIncidencia(string codigo,int numeroInc)
        {
            Servicio servicio = buscarServicio(codigo);
            if (servicio == null)
            {
                Console.WriteLine("No existe el servicio");
            }
            else
            {
                servicio.bajaDeIncidencia(numeroInc);
            }

        }
        public void ModificarIncidencia(string codigo, int numeroInc,
                                      DateTime fechaInc, string gravedad, string descrip, int prioridad,string estado)
        {
            Servicio servicio = buscarServicio(codigo);
            if (servicio == null)
            {
                Console.WriteLine("No existe el servicio");
            }
            else
            {
                if(!servicio.modificarIncidencia(numeroInc, fechaInc, gravedad, descrip, prioridad,estado))
                    Console.WriteLine("No existe la Incidencia a modificar");
            }
        }

        public List<IncidenciaVista> obtenerIncidenciasPorServicio(string codigo)
        {
            List<IncidenciaVista> listainc=new List<IncidenciaVista>();
            Servicio servicio = buscarServicio(codigo);
            if (servicio == null)
            {
                Console.WriteLine("No existe el servicio");
            }
            else
            {
                var incidencias= servicio.traerIncidencias();
                for(int i=0;i<incidencias.Count();i++)
                {
                    IncidenciaVista incv=new IncidenciaVista(incidencias.ElementAt(i).NumeroInc,
                                                             incidencias.ElementAt(i).FechaInc,
                                                             incidencias.ElementAt(i).NomSec,
                                                             incidencias.ElementAt(i).Gravedad,
                                                             incidencias.ElementAt(i).Descrip,
                                                             incidencias.ElementAt(i).Prioridad,
                                                             incidencias.ElementAt(i).Cod,
                                                             incidencias.ElementAt(i).Estado);
                    listainc.Add(incv);
                                                               
                }
                
            }
            return listainc;
        }

        private List<Servicio> obtenerTodosLosServicios()
        {
            Servicio servicio = new Servicio();
            List<Servicio> listaservicios = servicio.obtenerTodosLosServicios();
            return listaservicios;

        }

        public List<IncidenciaVista> ConsultarIncidenciasPorEstado(string estado)
        {
            List<IncidenciaVista> listaIncv = new List<IncidenciaVista>();
            List<Servicio> listaservicios = obtenerTodosLosServicios();
            foreach (Servicio servicio in listaservicios)
            {
                var listinc=servicio.traerIncidencias();
                for (int i=0;i<listinc.Count();i ++)
                {
                    if (listinc.ElementAt(i).Estado.Equals(estado))
                    {
                        IncidenciaVista incv = new IncidenciaVista(listinc.ElementAt(i).NumeroInc,
                                                               listinc.ElementAt(i).FechaInc,
                                                               listinc.ElementAt(i).NomSec,
                                                               listinc.ElementAt(i).Gravedad,
                                                               listinc.ElementAt(i).Descrip,
                                                               listinc.ElementAt(i).Prioridad,
                                                               listinc.ElementAt(i).Cod,
                                                               listinc.ElementAt(i).Estado);
                        listaIncv.Add(incv);
                    }
                }
              
            }
            return listaIncv;
        }

        public List<MicroVista> ConsultarMicrosenSector(String sector, String galpon) {

            List<Micro> micros = Micro.obtenerMicrosporSector(sector, galpon);
            List<MicroVista> res = new List<MicroVista>();
            foreach (Micro mi in micros)
            {
                MicroVista mv = new MicroVista(mi.NumInt, mi.Patente, mi.Modelo, mi.CantPasajeros, mi.Km, mi.Calidad);
                res.Add(mv);
            }
            return res;
        }
    }
}
